/*
 * InputForm.java
 *
 * Created on 13-Aug-2009, 14:44:25
 * Copyright me
 */
package iffmyexp;

import com.icesoft.faces.component.ext.HtmlDataTable;
import com.icesoft.faces.component.ext.HtmlInputTextarea;
import com.sun.rave.web.ui.appbase.AbstractPageBean;
import java.util.Vector;
import javax.faces.FacesException;
import javax.faces.model.SelectItem;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 */
public class InputForm extends AbstractPageBean {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    private int __placeholder;

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    private HtmlInputTextarea inputTextarea1 = new HtmlInputTextarea();

    public HtmlInputTextarea getInputTextarea1() {
        return inputTextarea1;
    }

    public void setInputTextarea1(HtmlInputTextarea hit) {
        this.inputTextarea1 = hit;
    }
    private String t = "false";

    public String gett() {
        return "falsfgdfg";
    }

    public void t(String hit) {
        this.t = "false";
    }
    public static HtmlDataTable inputsTable = new HtmlDataTable();

    public HtmlDataTable getinputsTable() {
        return inputsTable;
    }

    public void setinputsTable(HtmlDataTable hdt) {
        this.inputsTable = hdt;
    }

    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public InputForm() {
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("Page1 Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

    // </editor-fold>
    // Perform application initialization that must complete
    // *after* managed components are initialized
    // TODO - add your own initialization code here
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    public void destroy() {
    }

    public String button_action() throws Exception {

        System.out.println("test");
        DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
        Factory.setNamespaceAware(true);
        DocumentBuilder builder = Factory.newDocumentBuilder();
        Document doc = builder.parse("EBI_NCBI_BLAST.xml");
//creating an XPathFactory:
        XPathFactory factory = XPathFactory.newInstance();
//using this factory to create an XPath object:
        XPath xpath = factory.newXPath();
//XPath object created compiles the XPath expression for inputs:
        XPathExpression typeExpr = xpath.compile("//inputs/input/type/text()");
        Object typeResult = typeExpr.evaluate(doc, XPathConstants.NODESET);
        NodeList typeNodeList = (NodeList) typeResult;

        XPathExpression nameExpr = xpath.compile("//inputs/input/name/text()");
        Object nameResult = nameExpr.evaluate(doc, XPathConstants.NODESET);
        NodeList nameNodeList = (NodeList) nameResult;

        XPathExpression exampleExpr = xpath.compile("//inputs/input/example/text()");
        Object exampleResult = exampleExpr.evaluate(doc, XPathConstants.NODESET);
        NodeList exampleNodeList = (NodeList) exampleResult;

        inputInfo[] inputsList = new inputInfo[typeNodeList.getLength()];

        for (int i = 0; i < typeNodeList.getLength(); i++) {
            //flags
            boolean taf = false;
            boolean itf = false;
            boolean ddf = false;
            boolean iff = false;
            boolean rf = false;
            boolean cbf = false;
            Vector values = new Vector();
            //check flags by looking at UI component type
            if (typeNodeList.item(i).getNodeValue().equals("inputtext")) {
                itf = true;
            }

            if (typeNodeList.item(i).getNodeValue().equals("textarea")) {
                taf = true;
            }

            if (typeNodeList.item(i).getNodeValue().equals("dropdown")) {
                ddf = true;
                XPathExpression valuesExpr = xpath.compile("//inputs/input["+(i+1)+"]/values/value/text()");
                Object valuesResult = valuesExpr.evaluate(doc, XPathConstants.NODESET);
                NodeList valuesNodeList = (NodeList) valuesResult; 

                for (int j = 0; j < valuesNodeList.getLength(); j++) {
                    values.add(new SelectItem(valuesNodeList.item(j).getNodeValue()));
                }
            }

            if (typeNodeList.item(i).getNodeValue().equals("radio")) {
                rf = true;
                XPathExpression valuesExpr = xpath.compile("//inputs/input["+(i+1)+"]/values/value/text()");
                Object valuesResult = valuesExpr.evaluate(doc, XPathConstants.NODESET);
                NodeList valuesNodeList = (NodeList) valuesResult;

                for (int j = 0; j < valuesNodeList.getLength(); j++) {
                    values.add(new SelectItem(valuesNodeList.item(j).getNodeValue()));
                }
            }

            if (typeNodeList.item(i).getNodeValue().equals("checkbox")) {
                cbf = true;
                XPathExpression valuesExpr = xpath.compile("//inputs/input["+(i+1)+"]/values/value/text()");
                Object valuesResult = valuesExpr.evaluate(doc, XPathConstants.NODESET);
                NodeList valuesNodeList = (NodeList) valuesResult;

                for (int j = 0; j < valuesNodeList.getLength(); j++) {
                    values.add(new SelectItem(valuesNodeList.item(j).getNodeValue()));
                }
            }

            if (typeNodeList.item(i).getNodeValue().equals("file")) {
                iff = true;
            }

            inputInfo m = new inputInfo(typeNodeList.item(i).getNodeValue(), nameNodeList.item(i).getNodeValue(),
                    "String", itf, taf, ddf, iff, rf, cbf, values, exampleNodeList.item(i).getNodeValue(), "none");
            inputsList[i] = m;

        }
        inputsTable.setValue(inputsList);
        return null;
    }
}

